package core

import (
	"encoding/json"
	"fmt"
	"time"
)

const DateFormat = "2006-01-02"
const TimeFormat = "2006-01-02 15:04:05"

// TsTime 自定义时间格式
type TsTime int64
type OnlyRespTsTime time.Time

// UnmarshalJSON 实现TsTime类型的JSON反序列化接口
// 将JSON中的字符串时间解析为Unix时间戳并存储到TsTime中
// 参数bs: JSON字节数据
// 返回值: 解析错误信息
func (tst *TsTime) UnmarshalJSON(bs []byte) error {
	var date string
	err := json.Unmarshal(bs, &date)
	if err != nil {
		return err
	}
	tt, _ := time.ParseInLocation(TimeFormat, date, time.Local)
	*tst = TsTime(tt.Unix())
	return nil
}

// MarshalJSON 实现TsTime类型的JSON序列化接口
// 将Unix时间戳转换为指定格式的字符串进行JSON序列化
// 返回值: 序列化后的字节数据和错误信息
func (tst TsTime) MarshalJSON() ([]byte, error) {
	if tst == 0 {
		return json.Marshal(0)
	}
	tt := time.Unix(int64(tst), 0).Format(TimeFormat)
	return json.Marshal(tt)
}

// MarshalJSON 实现OnlyRespTsTime类型的JSON序列化接口
// 将time.Time类型转换为指定格式的字符串进行JSON序列化
// 返回值: 序列化后的字节数据和错误信息
func (otst OnlyRespTsTime) MarshalJSON() ([]byte, error) {
	tt := time.Time(otst).Format(TimeFormat)
	return json.Marshal(tt)
}

type OtMoney uint

// MarshalJSON 实现OnlyRespTsTime类型的JSON序列化接口
// 将time.Time类型转换为指定格式的字符串进行JSON序列化
// 返回值: 序列化后的字节数据和错误信息
func (otMoney OtMoney) MarshalJSON() ([]byte, error) {
	yuan := float64(otMoney) / 100.00
	// 直接使用格式化字符串确保两位小数
	formatted := fmt.Sprintf("%.2f", yuan)
	//转换回float64以确保精度
	//result, _ := strconv.ParseFloat(formatted, 64)
	//fmt.Println("金额：", formatted)

	return json.Marshal(formatted)
}

// FenToYuan 将分金额转换为元并保留指定小数位数
// 参数:
//   - fen: 以分为单位的金额
//
// 返回值:
//   - float64: 以元为单位的金额
func (tu OtMoney) FenToYuan(fen int) string {
	yuan := float64(fen) / 100.00
	// 直接使用格式化字符串确保两位小数
	return fmt.Sprintf("%.2f", yuan)
}
